package com.apps.java.javanote02;

public class _21异常 {
    /**
     * 异常
     * 	一、概述
     * 		异常：就是程序出现了不正常的情况
     *
     * 	二、异常体系：
     * 		Throwable{ Error 和	Exception{ RuntimeException 和  非RuntimeException} }
     *   	1.Error:严重问题，无需处理
     *   	2.Exception:称为异常类，它表示程序本身可以处理的问题
     *   		·RuntimeException：在编译期是不检查的，出现问题后，需要我们回来修改代码[运行异常]
     *   		·非RuntimeException：编译器就必须处理，否则程序不能通过编译，更不能正常运行。[编译异常]
     *
     * 	三、JVM[java虚拟机]默认处理方案
     * 		如果程序出现了问题，我们没有做任何处理，最终JVM会做默认的处理
     * 		1.将异常的名称、原因以及异常出现的位置等信息输出在控制台。
     * 		2.程序停止执行。
     *
     * 	四、异常处理
     * 		如果程序出现了问题，我们需要做自己处理
     * 		1.try...catch...
     * 			格式：
     * 				try{
     * 					可能出现异常的代码;
     * 				}catch(异常名称 变量名){
     * 					异常处理代码;
     * 				}
     * 			执行流程：
     * 				1.程序从try中的代码开始执行
     * 				2.出现异常，会自动生成一个异常类对象，该异常对象将被提交给java运行时系统
     * 				3.java运行时系统接收到异常对象时，会到catch中去找匹配的异常类，找到后进行异常的处理
     * 				4.执行完毕后，程序还可以继续往下执行
     * 		2.throws
     * 			概述：解决一些我们因权限问题无法处理的异常。
     * 			格式：
     * 			throws 异常类名;
     *
     *
     * 	五、Throwable的成员方法
     * 		方法名							说明
     * 		public String getMessage()		返回此Throwable的详细消息字符串
     * 		public String toString()		返回此可抛出的简短描述
     * 		public void printStackTrace()	把异常的错误信息输出在控制台
     *
     * 	六、编译时异常和运行时异常的区别
     * 		java中的异常被分为两大类：编译时异常和运行时异常，也被称为受检异常和非受检异常
     * 		所有的RuntimeException类极其子类被称为运行时异常，其他的异常都是编译时异常。
     *
     * 		区别:
     *			1.编译时异常：必须显示处理，否则程序就会发生错误，无法通过编译
     *			2.运行时异常：无需显示处理，也可以和编译时异常一样处理
     *
     * 	七、自定义异常
     * 		格式：
     * 			public class 异常类名 extends Exception {
     * 				无参构造
     * 				带参构造
     * 			}
     *
     * 	八、throws 和 throw 的区别
     * 		throws						throws
     * 	  1.用在方法声明后面，跟的是异常类名		用在方法体内，跟的是异常对象名
     * 	  2.表示抛出异常，由该方法的调用者来处理	表示抛出异常，由方法体内的语句处理
     * 	  3.表示出现异常的一种可能性，不一定会发生	执行throw一定抛出了某种异常
     *
     *
     */
    public static void main(String[] args){
        System.out.println("开始");
        method();
        System.out.println("结束");
        System.out.println("---------------");

        //调用运行异常方法
        abnormalOperation();
        //调用自定义异常方法
        try {
            check(120);
        } catch (_21自定义异常 e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static void method(){
//		int[] arr = {1,2,3};
//		System.out.println(arr[1]);
//		System.out.println(arr[3]);//ArrayIndexOutOfBoundsException：下标越界异常

/*
		try {
			//解决方案
			int[] arr = {1,2,3};
			System.out.println(arr[4]);//new Exception();
		} catch (Exception e) {
			String ma = e.getMessage();//public String getMessage()返回此Throwable的详细消息字符串
//			System.out.println(ma);

//			String ts = e.toString();//public String toString()返回此可抛出的简短描述
//			System.out.println(ts);

			e.printStackTrace();//public void printStackTrace()	把异常的错误信息输出在控制台
		}
*/

    }

    //运行时异常
    public static void	abnormalOperation(){
		/*
		try {
			int[] arr = {1,2,3};
			System.out.println(arr[3]);//它会报错，但在编译时不会出现报错提示
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		*/
    }

    //编译时异常
    public static void compilationException(){
        //int[] a = "123";//这种在编译时就出现报错提示的异常，就是编译时异常，必须主动处理
    }


    //使用自定义异常类
    public static void check(int num) throws _21自定义异常{
        if(num<0 || num>100){
            throw new _21自定义异常("if内的代码:你给的分数有误");
        }else {
            System.out.println("else内的代码：分数正常");
        }
    }

}
